/*!
 * \file amqp_parse.c
 *
 * \brief amqp 协议解析
 *
 * All Rights Reserved Copyright (C) 2014 broada,Co.,Ltd.\n
 *
 * \version 2.0
 * \author geyh
 * \date 2015/12/24
 *
 */

#include <stdlib.h>

#include "frreport_comm.h"
#include "frbyte_buffer.h"
#include "amqp_parse.h"

#include "amqp_comm10.h"
#include "amqp_comm9.h"

/*!
 * \ amqp 解析
 *
 * \ p_st_data                  (Frbyte_Packet * 入力数据)
 * \ p_st_body_data             (Frreport_body_data *      数据上报)
 * \ p_st_private               (st_amqp_private_data *    私有数据)
 * \ p_st_session_private       (L7session_amqp_private *  session数据)
 *
 * \return          FR_SUCC:frame 结束\n
 *                  FR_FAIL:frame 未结束\n
 */
int amqp_parse(Frbyte_Packet *p_st_data, Frreport_body_data *p_st_body_data, st_amqp_private_data *p_st_private, L7session_amqp_private *p_st_session_private)
{
    int i_flag_try = 0;
    int i_loop = 0, i_ret = 0;
    uint8_t u8_version_9 = 0x00;

    if(p_st_data == NULL || p_st_body_data == NULL || p_st_session_private == NULL)
        return APM_L7_ANALYZE_FAIL;

    if(p_st_session_private->i_version == 0xff)
        i_flag_try = 1;

    if(i_flag_try)
    {
        for (i_loop = 9; i_loop <= 10; i_loop ++)
        {
//            if(i_loop == 9)
//            {
//                //判断是否为版本9  第13位
//                i_ret = bytebuffer_get_at (p_st_data, bytebuff_getPosition (p_st_data) + 13, &u8_version_9);
//                if(i_ret == FR_FAIL || u8_version_9 != 0x09)
//                    continue;
//            }

            p_st_session_private->i_version = i_loop;
            i_ret = amqp_parse(p_st_data, p_st_body_data, p_st_private, p_st_session_private);
            if(i_ret == APM_L7_ANALYZE_FAIL)
            {
                bytebuff_rewind (p_st_data);
                continue;
            }

            if(i_ret == APM_L7_ANALYZE_SUCC)
            {
                if(bytebuff_remaining(p_st_data) != 0 && i_loop == 9)
                {
                    p_st_session_private->i_version = 0xff;
                    bytebuff_rewind (p_st_data);
                    continue;
                }
                else
                    return i_ret;
            }
        }

        p_st_session_private->i_version = 0xff;
        bytebuff_rewind (p_st_data);
        return APM_L7_ANALYZE_FAIL;
    }

    switch (p_st_session_private->i_version)
    {
        case 9:
//            //判断是否为版本9  第13位
//            i_ret = bytebuffer_get_at (p_st_data, bytebuff_getPosition (p_st_data) + 13, &u8_version_9);
//            if(i_ret == FR_FAIL || u8_version_9 != 0x09)
//                return APM_L7_ANALYZE_FAIL;

            i_ret = amqp_parse_0_9_0(p_st_data, p_st_body_data, p_st_private, p_st_session_private);
            return i_ret;

        case 10:
            i_ret = amqp_parse_1_0_0(p_st_data, p_st_body_data, p_st_private, p_st_session_private);
            return i_ret;

        default:
            return APM_L7_ANALYZE_FAIL;
    }


}
